package com.gobang.test;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;
import org.springframework.stereotype.Component;

/**
 * 日志使用示例类
 * 展示在五子棋项目中如何正确使用SLF4J日志框架
 * 
 * @author System
 * @version 1.0.0
 */
@Component
public class LoggingExample {
    
    /**
     * 使用 SLF4J 创建 Logger 实例
     * 推荐使用当前类的 Class 对象作为参数
     */
    private static final Logger logger = LoggerFactory.getLogger(LoggingExample.class);
    
    /**
     * 演示各种日志级别的使用
     */
    public void demonstrateLogLevels() {
        logger.debug("这是 DEBUG 级别日志，用于详细的调试信息");
        logger.info("这是 INFO 级别日志，用于一般的信息记录");
        logger.warn("这是 WARN 级别日志，用于警告信息");
        logger.error("这是 ERROR 级别日志，用于错误信息");
    }
    
    /**
     * 演示带参数的日志记录
     */
    public void demonstrateParameterizedLogging() {
        String playerName = "玩家1";
        int roomId = 1001;
        long startTime = System.currentTimeMillis();
        
        // 使用参数占位符，避免字符串拼接
        logger.info("玩家 {} 加入房间 {}", playerName, roomId);
        logger.debug("房间 {} 游戏开始时间: {}", roomId, startTime);
        
        // 多个参数的情况
        logger.info("游戏对战: 玩家1={}, 玩家2={}, 房间ID={}", "张三", "李四", roomId);
    }
    
    /**
     * 演示异常日志记录
     */
    public void demonstrateExceptionLogging() {
        try {
            // 模拟可能抛出异常的操作
            simulateException();
        } catch (IllegalArgumentException e) {
            // 记录异常信息，包含完整的堆栈跟踪
            logger.error("游戏参数验证失败: {}", e.getMessage(), e);
        } catch (Exception e) {
            // 记录未预期的异常
            logger.error("游戏过程中发生未知错误", e);
        }
    }
    
    /**
     * 演示条件日志记录
     */
    public void demonstrateConditionalLogging() {
        // 对于DEBUG级别的复杂日志，可以先判断是否启用
        if (logger.isDebugEnabled()) {
            String complexDebugInfo = buildComplexDebugInfo();
            logger.debug("复杂调试信息: {}", complexDebugInfo);
        }
        
        // 对于INFO级别通常不需要判断，因为性能影响较小
        logger.info("简单信息记录");
    }
    
    /**
     * 演示MDC（Mapped Diagnostic Context）使用
     * 用于在日志中添加上下文信息
     */
    public void demonstrateMDC() {
        try {
            // 设置MDC上下文信息
            MDC.put("userId", "user123");
            MDC.put("gameId", "game456");
            MDC.put("operation", "makeMove");
            
            logger.info("开始执行五子棋落子操作");
            logger.debug("验证落子位置合法性");
            logger.info("落子操作完成");
            
        } finally {
            // 清理MDC，避免内存泄漏
            MDC.clear();
        }
    }
    
    /**
     * 演示业务流程日志记录
     */
    public void demonstrateBusinessFlowLogging() {
        String gameId = "GAME_" + System.currentTimeMillis();
        String player1 = "张三";
        String player2 = "李四";
        
        logger.info("=== 开始新游戏 ===");
        logger.info("游戏ID: {}", gameId);
        logger.info("对战双方: {} vs {}", player1, player2);
        
        logger.debug("初始化棋盘...");
        logger.debug("设置玩家状态...");
        
        logger.info("游戏创建成功，等待玩家落子");
        
        // 模拟游戏进行
        for (int round = 1; round <= 3; round++) {
            logger.debug("第 {} 回合开始", round);
            logger.info("玩家 {} 落子完成", round % 2 == 1 ? player1 : player2);
        }
        
        logger.info("=== 游戏结束 ===");
    }
    
    /**
     * 模拟抛出异常的方法
     */
    private void simulateException() {
        throw new IllegalArgumentException("无效的棋盘坐标");
    }
    
    /**
     * 构建复杂的调试信息
     */
    private String buildComplexDebugInfo() {
        // 模拟构建复杂调试信息的过程
        StringBuilder sb = new StringBuilder();
        sb.append("棋盘状态: ");
        for (int i = 0; i < 5; i++) {
            sb.append("行").append(i).append("数据 ");
        }
        return sb.toString();
    }
} 